package com.geo.geoProject.client.donneesStatiques;

import java.util.ArrayList;
import java.util.List;

import com.geo.geoProject.client.application.Programme;
import com.geo.geoProject.shared.Utilisateur;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import com.smartgwt.client.widgets.Canvas;

public class ApplicationGestion {

	///////////////////////////////////////
	////////////// SINGLETON //////////////
	///////////////////////////////////////
	private static ApplicationGestion donnees = new ApplicationGestion() ;
	private ApplicationGestion() {}
	public static ApplicationGestion get() {return donnees ;}
	///////////////////////////////////////
	///////////////////////////////////////
	///////////////////////////////////////
	
	public Utilisateur utilisateur            = null                       ; // l'utilisateur couremment connecté (contiens le login ...)
	public Canvas      canvasGlobal           = null                       ; // le canvas de SmartGWT global (qui fait toute la page)
	public List<Programme> listeDesProgrammes = new ArrayList<Programme>() ; // la liste des programmes du bureau
	
	
	// FONCTION D'AJOUT DE COMPOSANTS DANS L'INTERFACE
	
	public static void ajouterComposant(Widget w) {
		get().canvasGlobal.addChild(w) ;
	}
	
	public static void ajouterComposant(Canvas c) {
		get().canvasGlobal.addChild(c) ;
	}

	public static void retirerComposant(Widget w) {
		w.setVisible(false) ;
	}

	static List<Integer> listeScripts   = new ArrayList<Integer>() ;
	static List<Timer>   listeProcesses = new ArrayList<Timer>()   ;
	static int idThread = 0 ;
	
	/**
	 * lance un script périodiquement et rends un PID pour pouvoir le killer avec la fonction stopScript().
	 * @param r
	 * @param delayMillis
	 * @return
	 */
	public static int runScriptPeriodically(final Runnable r, int delayMillis) {
		if (delayMillis<1) {
			System.out.println("Erreur, demande de lancement de script avec une période trop petite ("+delayMillis+")") ;
		}
		Timer t = new Timer() {
			public void run() {
				r.run() ;
			}
		};
		idThread++ ;
		listeScripts  .add(new Integer(idThread)) ;
		listeProcesses.add(t) ;
		t.scheduleRepeating(delayMillis) ;
		return idThread ;
	}
	
	public static void stopScript(int idThread) {
		
		for (int i = 0; i < listeScripts.size(); i++) {
			if (listeScripts.get(i).intValue()==idThread) {
				listeProcesses.get(i).cancel() ;
				listeScripts  .remove(i) ;
				listeProcesses.remove(i) ;
				return ;
			}
		}
	}

	
	public static void runScriptOnce(final Runnable r, int delayMillis) {
		if (delayMillis<100) {
			r.run() ;
			return ;
		}
		Timer t = new Timer() {
			public void run() {
				r.run() ;
			}
		};
		t.schedule(delayMillis) ;
	}
	public static void addWindowHandlet(ResizeHandler handler) {
		Window.addResizeHandler(handler) ;
	}

	
}
